function Music() {
  this.init();
}
(function() {
  var pages = [],
    panels = [],
    selectedItem = null;
  Music.prototype = {
    total: 70,
    pageSize: 10,
    dataUrl:
      "http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.search.common",
    playerUrl: "http://box.baidu.com/widget/flash/bdspacesong.swf",

    init: function() {
      var me = this;
      domUtils.on($G("J_searchName"), "keyup", function(event) {
        var e = window.event || event;
        if (e.keyCode == 13) {
          me.dosearch();
        }
      });
      domUtils.on($G("J_searchBtn"), "click", function() {
        me.dosearch();
      });
    },
    callback: function(data) {
      var me = this;
      me.data = data.song_list;
      setTimeout(function() {
        $G("J_resultBar").innerHTML = me._renderTemplate(data.song_list);
      }, 300);
    },
    dosearch: function() {
      var me = this;
      selectedItem = null;
      var key = $G("J_searchName").value;
      if (utils.trim(key) == "") return false;
      key = encodeURIComponent(key);
      me._sent(key);
    },
    doselect: function(i) {
      var me = this;
      if (typeof i == "object") {
        selectedItem = i;
      } else if (typeof i == "number") {
        selectedItem = me.data[i];
      }
    },
    onpageclick: function(id) {
      var me = this;
      for (var i = 0; i < pages.length; i++) {
        $G(pages[i]).className = "pageoff";
        $G(panels[i]).className = "paneloff";
      }
      $G("page" + id).className = "pageon";
      $G("panel" + id).className = "panelon";
    },
    listenTest: function(elem) {
      var me = this,
        view = $G("J_preview"),
        is_play_action = elem.className == "m-try",
        old_trying = me._getTryingElem();

      if (old_trying) {
        old_trying.className = "m-try";
        view.innerHTML = "";
      }
      if (is_play_action) {
        elem.className = "m-trying";
        view.innerHTML = me._buildMusicHtml(me._getUrl(true));
      }
    },
    _sent: function(param) {
      var me = this;
      $G("J_resultBar").innerHTML = '<div class="loading"></div>';

      utils.loadFile(document, {
        src:
          me.dataUrl +
          "&query=" +
          param +
          "&page_size=" +
          me.total +
          "&callback=music.callback&.r=" +
          Math.random(),
        tag: "script",
        type: "text/javascript",
        defer: "defer"
      });
    },
    _removeHtml: function(str) {
      var reg = /<\s*\/?\s*[^>]*\s*>/gi;
      return str.replace(reg, "");
    },
    _getUrl: function(isTryListen) {
      var me = this;
      var param =
        "from=tiebasongwidget&url=&name=" +
        encodeURIComponent(me._removeHtml(selectedItem.title)) +
        "&artist=" +
        encodeURIComponent(me._removeHtml(selectedItem.author)) +
        "&extra=" +
        encodeURIComponent(me._removeHtml(selectedItem.album_title)) +
        "&autoPlay=" +
        isTryListen +
        "" +
        "&loop=true";
      return me.playerUrl + "?" + param;
    },
    _getTryingElem: function() {
      var s = $G("J_listPanel").getElementsByTagName("span");

      for (var i = 0; i < s.length; i++) {
        if (s[i].className == "m-trying") return s[i];
      }
      return null;
    },
    _buildMusicHtml: function(playerUrl) {
      var html =
        '<embed class="BDE_try_Music" allowfullscreen="false" pluginspage="http://www.macromedia.com/go/getflashplayer"';
      html += ' src="' + playerUrl + '"';
      html += ' width="1" height="1" style="position:absolute;left:-2000px;"';
      html +=
        ' type="application/x-shockwave-flash" wmode="transparent" play="true" loop="false"';
      html += ' menu="false" allowscriptaccess="never" scale="noborder">';
      return html;
    },
    _byteLength: function(str) {
      return str.replace(/[^\u0000-\u007f]/g, "\u0061\u0061").length;
    },
    _getMaxText: function(s) {
      var me = this;
      s = me._removeHtml(s);
      if (me._byteLength(s) > 12) return s.substring(0, 5) + "...";
      if (!s) s = "&nbsp;";
      return s;
    },
    _rebuildData: function(data) {
      var me = this,
        newData = [],
        d = me.pageSize,
        itembox;
      for (var i = 0; i < data.length; i++) {
        if ((i + d) % d == 0) {
          itembox = [];
          newData.push(itembox);
        }
        itembox.push(data[i]);
      }
      return newData;
    },
    _renderTemplate: function(data) {
      var me = this;
      if (data.length == 0)
        return '<div class="empty">' + lang.emptyTxt + "</div>";
      data = me._rebuildData(data);
      var s = [],
        p = [],
        t = [];
      s.push('<div id="J_listPanel" class="listPanel">');
      p.push('<div class="page">');
      for (var i = 0, tmpList; (tmpList = data[i++]); ) {
        panels.push("panel" + i);
        pages.push("page" + i);
        if (i == 1) {
          s.push('<div id="panel' + i + '" class="panelon">');
          if (data.length != 1) {
            t.push(
              '<div id="page' +
                i +
                '" onclick="music.onpageclick(' +
                i +
                ')" class="pageon">' +
                i +
                "</div>"
            );
          }
        } else {
          s.push('<div id="panel' + i + '" class="paneloff">');
          t.push(
            '<div id="page' +
              i +
              '" onclick="music.onpageclick(' +
              i +
              ')" class="pageoff">' +
              i +
              "</div>"
          );
        }
        s.push('<div class="m-box">');
        s.push(
          '<div class="m-h"><span class="m-t">' +
            lang.chapter +
            '</span><span class="m-s">' +
            lang.singer +
            '</span><span class="m-z">' +
            lang.special +
            '</span><span class="m-try-t">' +
            lang.listenTest +
            "</span></div>"
        );
        for (var j = 0, tmpObj; (tmpObj = tmpList[j++]); ) {
          s.push('<label for="radio-' + i + "-" + j + '" class="m-m">');
          s.push(
            '<input type="radio" id="radio-' +
              i +
              "-" +
              j +
              '" name="musicId" class="m-l" onclick="music.doselect(' +
              (me.pageSize * (i - 1) + (j - 1)) +
              ')"/>'
          );
          s.push(
            '<span class="m-t">' + me._getMaxText(tmpObj.title) + "</span>"
          );
          s.push(
            '<span class="m-s">' + me._getMaxText(tmpObj.author) + "</span>"
          );
          s.push(
            '<span class="m-z">' +
              me._getMaxText(tmpObj.album_title) +
              "</span>"
          );
          s.push(
            '<span class="m-try" onclick="music.doselect(' +
              (me.pageSize * (i - 1) + (j - 1)) +
              ');music.listenTest(this)"></span>'
          );
          s.push("</label>");
        }
        s.push("</div>");
        s.push("</div>");
      }
      t.reverse();
      p.push(t.join(""));
      s.push("</div>");
      p.push("</div>");
      return s.join("") + p.join("");
    },
    exec: function() {
      var me = this;
      if (selectedItem == null) return;
      $G("J_preview").innerHTML = "";
      editor.execCommand("music", {
        url: me._getUrl(false),
        width: 400,
        height: 95
      });
    }
  };
})();
